package com.atguigu.realtime.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @ClassName: DimQuery
 * @Description:
 * @Author: kele
 * @Date: 2021/4/21 18:49
 **/
public class DimQuery {


    public static JSONObject getDimQuery(Connection conn,
                                   String table,
                                   Object id) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException {

        String sql = "select * from " + table + " where id =?";

        Object[] arg = {id};

        List<JSONObject> query = MyJDBCUtil.getQuery(conn,
                sql,
                arg,
                JSONObject.class);

        //根据id查询的数据，只会查询到一条数据
        return query.get(0);
    }

    /**
     *
     * 先通过redis查询数据，如果redis查询不到数据，则向hbase中查询数据
     *
     * 数据在redis中：
     *      方案一：按照string类型存储
     *          优点：
     *              1、可以单独的设置某个过期时间
     *              2、可以方便的查询
     *           缺点：
     *              key值过多
     *              占用内存较大
     *
     *       方案二：hash
     *           优点：
     *              key较少，有多少个维度表，就有多少个key
     *           缺点:
     *              不能单独的对某个数据设置过期时间
     *
     *  采用方案一：
     *     key     value
     *   表名+id     json字符串
     *
     */
    public static JSONObject getDimQuery(Connection conn,
                                         Jedis jedis,
                                         String table,
                                         Object id) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException {

        String jsonObj = null;

        //创建key的字符串
        String key = table + ":" + id.toString();

        jsonObj = jedis.get(key);
        //如果通过redis查不到数据，则通过phoenix查询数据，再将查询出的结果放入到jedis中
        if(jsonObj == null){

            String sql = "select * from " + table + " where id =?";

            Object[] arg = {id};

            List<JSONObject> query = MyJDBCUtil.getQuery(conn,
                    sql,
                    arg,
                    JSONObject.class);

            //根据id查询的数据，只会查询到一条数据

            if(query != null && !query.isEmpty()){

                jsonObj =  query.get(0).toJSONString();

                jedis.setex(key,60*60*24,jsonObj);
            }

        }

        return JSONObject.parseObject(jsonObj);
    }
}
